/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Aplicacion;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;


/**
 *
 * @author CARLOS IBARGUEN
 */
public class Lista extends Archivo {
    private BufferedReader leer;
    //cabeza del nodo
    Nodo ptr;

    public Lista() {
    ptr=null;
    }

//leer y cargar datos del archivo plano
public void LeerArchivo(String nombre){
    String lineaArch;
    Nodo p=ptr;
    try{
     leer=new BufferedReader(new FileReader(nombre));
        while ((lineaArch=leer.readLine())!=null) {
           String [] vector=lineaArch.split(":"); //separador
            if (validarNombrePid(Integer.valueOf(vector[0]),  vector[1])) {
            AgregarListaOrdenada(Integer.valueOf(vector[0]), vector[1],Integer.valueOf( vector[2]), vector[3].substring(0, vector[3].length()-1));
           }else{
   llenar(Integer.valueOf(vector[0]), vector[1],Integer.valueOf( vector[2]), vector[3].substring(0, vector[3].length()-1));//le quita un caracter
            }
        }
leer.close();
    }catch(Exception e){
    }
}

//sobreescribe el archivo por los datos ingresados por el usuario
public void SobreEscrivirArc(String nombre){
    String linea;
       try {
        File cop=new File(nombre);
        setNombre("copyy.txt");
        crear();
        File proc=new  File("copyy.txt");
        leer=new BufferedReader(new FileReader(nombre));
        while ((linea=leer.readLine())!=null) {
             String vector[]=linea.split(":");
             llenar(Integer.valueOf(vector[0]), vector[1],Integer.valueOf( vector[2]), vector[3].substring(0, vector[3].length()-1));
     }
       llenar(27,"ventana",3,"8-888");
  cerrar();
  leer.close();
  cop.delete();
  proc.renameTo(cop);
    } catch (Exception e) {
    }
}

//
public boolean validarNombrePid(int PID,String nombre){
Nodo p=ptr;
boolean sw = true;
    while (p!=null) {        
        if(p.getPID()==PID||p.getNombre().compareTo(nombre)==0){
            sw= false;      
        }
        p=p.getSiguiente();
    }
    
    return sw;
}

//almacena en un vector los nodos de la lista
public String [] mostar(){
 String [] vector = new String[numerodenodo()];
 int cont=0;
 Nodo pr=ptr;
 while (pr!=null) {
 vector[cont]=pr.getPID()+":"+pr.getNombre()+":"+pr.getPrioridad()+":"+pr.getRangoDato();
pr=pr.getSiguiente();
cont+=1;
    }
 return  vector;
}

//obtiene el numero de nodos de la lista
public int numerodenodo(){
    Nodo p=ptr;
    int cont=0;
    while (p!=null) {
    p=p.getSiguiente();
    cont+=1;
    }
    return cont;
}

//agrega datos ordenados a la lita y verificar prioridades de los procesos
public void AgregarListaOrdenada(int PID,String Nombre,int Prioridad,String RangoDato ){
    Nodo nuevo;
   if(ptr==null){
       nuevo=new Nodo(PID, Nombre, Prioridad, RangoDato);
      ptr=nuevo;
   }else{
      if(Prioridad<ptr.getPrioridad()){
          nuevo=new  Nodo(PID, Nombre, Prioridad, RangoDato);
          nuevo.setSiguiente(ptr);
          ptr=nuevo;
      }else{
          Nodo anterior=ptr;
          Nodo pos=ptr.getSiguiente();
          while (pos!=null) {
              if (pos.getPrioridad()>Prioridad) {
                  break;
              }else{
                  anterior=pos;
                  pos=pos.getSiguiente();
              }
             
          }
           nuevo=new Nodo(PID, Nombre, Prioridad, RangoDato);
              nuevo.setSiguiente(anterior.getSiguiente());
              anterior.setSiguiente(nuevo);
      }    
   }
}

//ejecuta los procesos lanzandolos por prioridad
 public  int [] Ejecutar(){
     Nodo p=ptr;
     int i=0;
     int prio=p.getPrioridad();
     int []vector= new int[6];    
     while (p!=null) {
         if (p.getPrioridad()==prio) {
            i+=1; 
         }else{
             vector[prio]=i;
             i=1;
             prio=p.getPrioridad();
             if (p.getPrioridad()!=prio) {
                 vector[prio]=i;
                 prio+=1;
             }            
         }
p=p.getSiguiente();
     }
if(p==null){
    vector[prio]=i;
}
return vector;
 }
}
